/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 * Copyright (c) 2008-2011, Salzburg Research. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * - Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the following disclaimer.
 * - Redistributions in binary form must reproduce the above copyright notice,
 * this list of conditions and the following disclaimer in the documentation
 * and/or other materials provided with the distribution.
 * - Neither the name of the LMF library client Project nor the names of its contributors
 * may be used to endorse or promote products derived from this software
 * without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * Contributor(s):
 * Stephanie Stroka
 *
 * File Info:
 * User: Stephanie Stroka
 * Date: 2011/08/19
 * Time: 18:04
 *
 * Project: lmflib
 */

package kiwi.facading.model.resources;

import java.net.URI;
import java.net.URISyntaxException;

/**
 * Created by IntelliJ IDEA.
 * User: sstroka
 * Date: 31.05.2011
 * Time: 12:55:07
 * To change this template use File | Settings | File Templates.
 */
public class KiWiUriResource extends KiWiResource {

    private String uri;


    private KiWiUriResource() {
        super();
    }

    public KiWiUriResource(String uri) {
        super();
        this.uri = uri;
    }

    public String getUri() {
        return uri;
    }

    public void setUri(String uri) {
        this.uri = uri;
    }


    @Override
    public boolean isAnonymousResource() {
        return false;
    }

    @Override
    public boolean isUriResource() {
        return true;
    }

    /** Creates a short name for the URI - either the fragment or the word after the (second to the) last slash.
      *
      * For
      * 		http://example.com/ns#frament 		it will return "fragment"
      * 		http://example.com/ontology/		it will return "ontology"
      * 		http://example.com/ontology			it will return "ontology"
      *
      *
      * @return
      * @throws java.net.URISyntaxException
      */
     public String getShortName() throws URISyntaxException {
         String uri = getUri();
         String name = new URI(uri).getFragment(); //URI-reference = [ absoluteURI | relativeURI ] [ "#" fragment ] http://www.ietf.org/rfc/rfc2396.txt
         if (name == null || name.length() == 0) {
             if ((uri.lastIndexOf('/')+1) == uri.length())
                 uri = uri.substring(0,uri.lastIndexOf('/'));

             name = uri.substring(uri.lastIndexOf('/')+1);
         }
         return name;
     }


    @Override
    public  String getKiwiIdentifier() {
        return "uri::"+getUri();
    }

    /* Return a unique cache key for this Content Item
     *
     * @author
     * @return
     * @see kiwi.core.model.content.KiWiNode#getCacheKey()
     */
    @Override
    public String getCacheKey() {
        return uri;
    }


    @Override
    public String toString() {
        return uri;
    }


    /**
     * Return a representation of the node in TURTLE syntax.
     * <p/>
     * http://www.w3.org/TeamSubmission/turtle/
     *
     * @return
     */
    @Override
    public String toTurtle() {
        return "<" + uri + ">";
    }

    /**
     * Return a representation of the node in RDF/JSON syntax.
     * <p/>
     * http://n2.talis.com/wiki/RDF_JSON_Specification
     *
     * @return
     */
    @Override
    public String toJSON(boolean asObject) {
        String result =  "\""+uri+"\"";

        if(asObject) {
            return "{  \"type\" : \"uri\", \"value\" : "+result+" }";
        } else {
            return result;
        }
    }


    @Override
    public boolean equals(Object o) {
        if (this == o) return true;

        if(o == null || o.getClass() != this.getClass()) {
            return false;
        }

        KiWiUriResource resource = (KiWiUriResource) o;

        if (getUri() != null ? !getUri().equals(resource.getUri()) : resource.getUri() != null) return false;

        return true;
    }

    @Override
    public int hashCode() {
        return getUri() != null ? getUri().hashCode() : 0;
    }

}
